/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import analiseSintatica.estruturadados.NoArvore;

import java.util.LinkedList;

/**
 *
 * @author aluno
 */
public class RegraOpAdicao extends Regra{


    protected static Regra instancia;


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraOpAdicao() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraOpAdicao getInstance() {
        if (instancia == null) {
            instancia = new RegraOpAdicao();
        }
        return (RegraOpAdicao) instancia;
    }

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {

         NoArvore terminalOpAdicao = new NoArvore("<op_adicao>", false);

        
        if (listaTokens.getFirst().getToken().equals("op_adicao")) {

            if ((listaTokens.getFirst().getLexema().equals("+")) ||(listaTokens.getFirst().getLexema().equals("-"))) {
                terminalOpAdicao.adicionaFilho(new NoArvore(listaTokens.pop().getLexema(), true));
            } else {
                throw new ErroSintaticoException();
            }
        } else {
            throw new ErroSintaticoException();
        }
        return terminalOpAdicao;
    }

    

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("+");
        this.primeiro.add("-");
    }

    @Override
    protected void setSeguinte() {
       // S<op_adicao> = P<multiplicacao>
        seguinte.add("(");
        seguinte.add("{");
        seguinte.add("identificador");
        seguinte.add("numeroInteiro");
        seguinte.add("numeroFlutuante");
        seguinte.add("charconst");
        seguinte.add("++");
        seguinte.add("--");
        seguinte.add("&");
        seguinte.add("*");
    }

}
